﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CANO.Data.DAOs.Compromisos;

namespace CANO.Data.DAOs
{
	public class EntrevistaDAO
	{
		public int EntrevistaID { get; set; }
		public DateTime Hora { get; set; }
		public int ContactoComprador { get; set; }
		public int ContactoVendedor { get; set; }
		public string ContactoCompradorDisplay { get; set; }
		public string ContactoVendedorDisplay { get; set; }
		public int Usuario { get; set; }
		public List<SeguimientoDAO> Seguimientos { get; set; }
		public string HoraDisplay { get; set; }
		public List<UsuarioDAO> CompartidoCon { get; set; }

		public int Create(int CurrentUser)
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{
				Entrevista newEntrevista = new Entrevista();
				newEntrevista.Hora = this.Hora;
				newEntrevista.ContactoComprador = this.ContactoComprador;
				newEntrevista.ContactoVendedor = this.ContactoVendedor;
				newEntrevista.Usuario = CurrentUser;

				context.Entrevista.InsertOnSubmit(newEntrevista);
				context.SubmitChanges();

				return newEntrevista.EntrevistaID;
			}
		}

		public void Update()
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{
				var entrevista =
					(from e in context.Entrevista
					 where e.EntrevistaID == this.EntrevistaID
					 select e).Single();

				entrevista.Hora = this.Hora;
				entrevista.ContactoComprador = this.ContactoComprador;
				entrevista.ContactoVendedor = this.ContactoVendedor;

				context.SubmitChanges();
			}
		}
		
		public List<EntrevistaDAO> GetAllByContact(int ContactID)
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{
				List<EntrevistaDAO> ListaEntrevistas = new List<EntrevistaDAO>();

				var entrevistas =
					from e in context.Entrevista
					where (e.ContactoComprador == ContactID || e.ContactoVendedor == ContactID) && e.Hora >= DateTime.Now
					orderby e.Hora ascending
					select e;


				foreach (var item in entrevistas)
				{
					EntrevistaDAO entrevista = new EntrevistaDAO();
					entrevista.EntrevistaID = item.EntrevistaID;
					entrevista.ContactoComprador = item.ContactoComprador;
					entrevista.ContactoVendedor = item.ContactoVendedor;
					entrevista.Hora = item.Hora;
					entrevista.ContactoCompradorDisplay = new ContactoDAO().GetNameByID(item.ContactoComprador);
					entrevista.ContactoVendedorDisplay = new ContactoDAO().GetNameByID(item.ContactoVendedor);
					entrevista.Usuario = item.Usuario.Value;
					entrevista.Seguimientos = new SeguimientoDAO().GetSeguimientosByEntrevista(item.EntrevistaID);
					entrevista.HoraDisplay = item.Hora.ToShortDateString() + " " + item.Hora.ToShortTimeString();
					entrevista.CompartidoCon = this.GetUsersByEntrevistaID(entrevista.EntrevistaID);
					ListaEntrevistas.Add(entrevista);
				}
				return ListaEntrevistas;
			}
		}

		public List<EntrevistaDAO> GetCurrentWeekManager()
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{
				List<EntrevistaDAO> ListaEntrevistas = new List<EntrevistaDAO>();
				
				DateTime currentDay = DateTime.Now.Date;
				DateTime stratDay = currentDay;
				DateTime endDay = currentDay.AddDays(7);

				var entrevistas =
					from e in context.Entrevista
					where (e.Hora >= stratDay && e.Hora <= endDay)
					orderby e.Hora ascending
					select e;

				foreach (var item in entrevistas)
				{
					EntrevistaDAO entrevista = new EntrevistaDAO();
					entrevista.EntrevistaID = item.EntrevistaID;
					entrevista.ContactoComprador = item.ContactoComprador;
					entrevista.ContactoVendedor = item.ContactoVendedor;
					entrevista.Hora = item.Hora;
					entrevista.ContactoCompradorDisplay = new ContactoDAO().GetNameByID(item.ContactoComprador);
					entrevista.ContactoVendedorDisplay = new ContactoDAO().GetNameByID(item.ContactoVendedor);
					entrevista.Usuario = item.Usuario.Value;
					entrevista.CompartidoCon = this.GetUsersByEntrevistaID(entrevista.EntrevistaID);
					ListaEntrevistas.Add(entrevista);
				}
				return ListaEntrevistas;
			}
		}

		public EntrevistaDAO GetEntrevistaByID(int CompromisoID)
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{
				var entrevistas =
					from e in context.Entrevista
					where e.EntrevistaID == CompromisoID
					select e;

				var item = entrevistas.SingleOrDefault();

					EntrevistaDAO entrevista = new EntrevistaDAO();
					entrevista.EntrevistaID = item.EntrevistaID;
					entrevista.ContactoComprador = item.ContactoComprador;
					entrevista.ContactoVendedor = item.ContactoVendedor;
					entrevista.Hora = item.Hora;
					entrevista.ContactoCompradorDisplay = new ContactoDAO().GetNameByID(item.ContactoComprador);
					entrevista.ContactoVendedorDisplay = new ContactoDAO().GetNameByID(item.ContactoVendedor);
					entrevista.Usuario = item.Usuario.Value;
					entrevista.CompartidoCon = this.GetUsersByEntrevistaID(entrevista.EntrevistaID);
					return entrevista;
			}
		}

		internal List<EntrevistaDAO> GetCurrentWeekByUser(int UserID)
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{
				List<EntrevistaDAO> ListaEntrevistas = new List<EntrevistaDAO>();

				DateTime currentDay = DateTime.Now.Date;
				DateTime stratDay = currentDay;
				DateTime endDay = currentDay.AddDays(7);

				var entrevistas =
					from e in context.Entrevista
					where (e.Hora >= stratDay && e.Hora <= endDay) && (e.Usuario == UserID)
					orderby e.Hora ascending
					select e;

				foreach (var item in entrevistas)
				{
					EntrevistaDAO entrevista = new EntrevistaDAO();
					entrevista.EntrevistaID = item.EntrevistaID;
					entrevista.ContactoComprador = item.ContactoComprador;
					entrevista.ContactoVendedor = item.ContactoVendedor;
					entrevista.Hora = item.Hora;
					entrevista.ContactoCompradorDisplay = new ContactoDAO().GetNameByID(item.ContactoComprador);
					entrevista.ContactoVendedorDisplay = new ContactoDAO().GetNameByID(item.ContactoVendedor);
					entrevista.Usuario = item.Usuario.Value;
					entrevista.CompartidoCon = this.GetUsersByEntrevistaID(entrevista.EntrevistaID);
					ListaEntrevistas.Add(entrevista);
				}
				return ListaEntrevistas;
			}
		}

		public List<UsuarioDAO> GetUsersByEntrevistaID(int EntrevistaID)
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{
				List<UsuarioDAO> listUser = new List<UsuarioDAO>();
				
					var entrevistas =
						from e in context.Entrevista
						join cc in context.EntrevistaCompartida on e.EntrevistaID equals cc.EntrevistaID
						where (e.EntrevistaID == EntrevistaID || cc.EntrevistaID == EntrevistaID)
						select new { e, cc };

					foreach (var item in entrevistas)
					{
						if (item.cc.UsuarioCompartido != null)
							listUser.Add(new UsuarioDAO().getUser(item.cc.UsuarioCompartido));
						else
							listUser.Add(new UsuarioDAO().getUser(item.e.Usuario.Value));
					}


				return listUser;
			}
		}
	}
}
